﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class Relacionamento
{
	public Individuo individuo;
	public bool isKnown = false;
}

[RequireComponent(typeof(Collider))]
public class Individuo : MonoBehaviour
{
	#region Variables 

	//TODO TEMP! sair daqui para usar a referencia do codigo do SelectionManager
	public bool isSelected = false;

	//falas
	public string thoughsOnProblems = "Thinking about my problems...";
	public string talkAboutProblems = "Talking about my problems...";
	public string talkThankfully = "My problems are solved!";
	public string talkHappy = "Good morning! I have no problems.";

	//status
	public bool isMyProblemSolved = false;
	public bool hasHelpedOther = false;

	//relacoes com outros
	public Individuo oneThatSolvesMyProblem;
	public Individuo oneThatNeedsMyHelp;
	public List<Relacionamento> conhecidos = new List<Relacionamento>();

	#endregion
	#region EngineCalls

	void OnEnable()
	{
		
	}

	void OnDisable()
	{

	}

	void OnCollisionEnter( Collision info )
	{
		if (!isSelected)
			return;

		//se esbarrar em alguém, conversa com a pessoa
		Individuo other = info.gameObject.GetComponent<Individuo>();

		if (other != null)
			TalkToOtherIndividuo(other);
	}

	#endregion
	#region Actions

	void TalkToOtherIndividuo( Individuo target )
	{
		//fala com o outro
		target.OnTalkedWith(this);

		//conhecem um ao outro
		GetToKnowOther(target);
		target.GetToKnowOther(this);
	}

	void GetToKnowOther (Individuo other)
	{
		for (int i = 0 ; i < conhecidos.Count ; i++)
		{
			if (conhecidos[i].individuo == other)
			{
				//se nao conhece o outro ainda
				if (!conhecidos[i].isKnown)
				{
					Debug.Log("I've made a new friend!");
					conhecidos[i].isKnown = true;
				}
			}
		}
	}

	#endregion
	#region Calls

	/// <summary>
	/// Fui selecionado.
	/// </summary>
	[ContextMenu("Select Individuo")]
	void OnSelect()
	{
		isSelected = true;

		//se tiver problemas, fapensa nos problemas
		ThinkAboutMyProblems();

		//mostra quem é cinza e quem é colorido para esse char
		for (int i = 0 ; i < conhecidos.Count ; i++)
		{
			if (conhecidos[i].isKnown)
				conhecidos[i].individuo.ShowIndividuo();
			else
				conhecidos[i].individuo.HideIndividuo();
		}
	}

	/// <summary>
	/// Fui desselecionado.
	/// </summary>
	[ContextMenu("Desselect Individuo")]
	void OnDesselect()
	{
		isSelected = false;
	}

	/// <summary>
	/// Falaram comigo.
	/// </summary>
	/// <param name="talker">Talker.</param>
	void OnTalkedWith( Individuo talker )
	{
		if ( !isMyProblemSolved && talker.isMyProblemSolved && talker == oneThatSolvesMyProblem )
		{
			SolveMyProblem();
		}
		else if (!isMyProblemSolved)
		{
			TalkAboutMyProblems();
		}
		else
		{
			TalkHappy();
		}
	}

	/// <summary>
	/// Meu problema acaba de ser resolvido.
	/// </summary>
	[ContextMenu("Solve Problem")]
	void SolveMyProblem()
	{
		Debug.Log("My problem is solved!", this);
		isMyProblemSolved = true;
		TalkThankfully();
	}

	[ContextMenu("Help Other")]
	void HelpOther()
	{
		Debug.Log("I helped somebody solving their problems!");
		hasHelpedOther = true;
	}

	#endregion
	#region SayThings

	/// <summary>
	/// Fui selecionado e tenho problemas: penso nos problemas.
	/// </summary>
	[ContextMenu("Think About Problems")]
	void ThinkAboutMyProblems()
	{
		if (isMyProblemSolved)
		{
			TalkHappy();
			return;
		}

		Debug.Log("Pensando nos meus problemas.", this);
	}

	/// <summary>
	/// Falaram comigo e tenho problemas: falo dos problemas.
	/// </summary>
	[ContextMenu("Talk About Problems")]
	void TalkAboutMyProblems()
	{
		Debug.Log("Falando dos meus problemas.", this);
	}

	/// <summary>
	/// Meus problemas acabaram de ser resolvidos.
	/// </summary>
	void TalkThankfully()
	{
		Debug.Log("Meus problemas acabaram!", this);
	}

	/// <summary>
	/// Falaram comigo/me selecionaram e não tenho problemas.
	/// </summary>
	[ContextMenu("Talk Happy")]
	void TalkHappy()
	{
		Debug.Log("Não tenho problemas, estou feliz!", this);
	}

	#endregion
	#region LooksKnown

	/// <summary>
	/// Quando é selecionado ou quando um outro individuo que conhece este individuo é selecionado, os gráficos dele devem aparecer.
	/// </summary>
	void ShowIndividuo()
	{
		//TODO chamar o codigo que mostra o desenho do char
	}

	/// <summary>
	/// Volta a ser uma pessoa cinza sem rosto.
	/// </summary>
	void HideIndividuo()
	{
		//TODO chamar o codigo que deixa ele cinza
	}

	#endregion
}
